#include "fifo.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * 函数：模拟FIFO（先进先出）页面置换算法。
 *
 * @param queue_frames 一个字符串，表示页面访问序列。
 *                     字符串中的每个字符是一个数字，表示一个页面号。
 * @param num_frames   页框的数量，表示物理内存中可用的页框数。
 */
void
fifo_page_replacement (char *queue_frames, int num)
{
  // TODO
  int *frames = malloc (num * sizeof (int));
  if (frames == NULL)
    {
      fprintf (stderr, "Memory allocation failed\n");
      return;
    }

  for(int i = 0; i < num; i++)
    {
      frames[i] = -1; // 初始化页框为-1，表示空闲
    }
  
  int front = 0; // 指向下一个要替换的页框
  int size = 0; // 当前已填充的页框数量
  int page_faults = 0; // 页面错误计数器

  const char delimiter[] = ",";
  char *str=queue_frames;
  char *token = strtok(str, delimiter);
    
    while (token != NULL) {
        int page = atoi(token); // 将字符串转换为整数
        int found = 0; // 标志位，表示是否找到页面
        for (int i = 0; i < size; i++) {
            if (frames[i] == page) {
                found = 1; // 找到页面
                break;
            }
        }
        if (!found) { // 页面未找到，发生页面错误
            page_faults++;
            if (size < num) { // 如果还有空闲页框
                frames[size++] = page; // 填充新页面
            } else { // 所有页框已满，进行替换
                frames[front] = page; // 替换最旧的页面
                front = (front + 1) % num; // 更新front指针
            }
        }
        // 打印当前页框状态 
        printf("Access:%d,Frames: [", page);
        for (int i = 0; i < num; i++) {
          printf("%d", frames[i]);
          if(i<num-1)
            printf(",");
        }
        printf("]\n");
        token = strtok(NULL, delimiter); // 继续提取下一个
    }

  free(frames); // 释放分配的内存
  return;

}
